package com.tjjingpan.jetpack.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import androidx.lifecycle.ViewModel
import com.tjjingpan.jetpack.Repository
import com.tjjingpan.jetpack.User

/*
* 退出程序之后再重新打开，数据仍然不会丢失
* 实现这个功能需要在退出程序的时候对当前的计数进行保存，然后在重新打开程序的时候读取之前
* 保存的计数，并传递给MainViewModel。
* MainViewModel 的构造函数函数添加了一个countReserver参数，这个参数用于记录之前可在的计数，
* 并在初始化的时候赋值给counter变量
* */
class MainViewModel(countReserver:Int) :ViewModel() {
    //根据前面所学的知识，所有界面相关的数据应该放到ViewModel中。那么这里
    //我们要求实现一个计数器的功能，就可以在ViewModel中加入一个counter变量
    //用于计数
    //var counter = countReserver

    /*将counter变量修改成了一个MutableLiveData对象，并指定它的泛型为Int,
    表示它包含的是整形数据。MutableLiveData是一种可变的LiveData，它的用法很简单，主要
    有3种读写数据的方法，分别是getValue(),setValue和postValue()方法。getValue()
    方法用于获取LiveData中包含的数据，setValue方法用于给LiveData设置数据，但是只能在
    主线程中调用,postValue()方法用于在非主线程中组LiveData设置数据
    * */
    private val _counter = MutableLiveData<Int>()
    //在非ViewModel中就只能实现观察LiveData的数据变化，不能给LiveData设置数据
    val counter:LiveData<Int>
        get() = _counter

    private val userLiveData = MutableLiveData<User>()
    //如果MainActivity中明确只会显示用户的姓名，而完全不关心用户的年龄，那么这个时候将整个User类型的LiveData暴露
    //给外部，就显得不那么合适了。
    //而map()方法就是专门解决这种问题的，它可以将User类型的LiveData自由地转型成任意其他类型的LiveData
    val userName:LiveData<String> = Transformations.map(userLiveData){user ->
        "${user.firstName} ${user.lastName}"
    }

    //定义了一个新的userIdLiveData对象，用业观察userId的数据变化
    private val userIdLiveData = MutableLiveData<String>()

    //如果ViewModel中的某个LiveData对象是调用另外的方法获取的，那么我们就可以借助switchMap()
    //方法，将这个LiveData对象转成另外一个可观察的LiveData对象。

    /*
    * 首先，当外部调用MainViewMOdel的getUser()方法获取用户数据时，并不会发起任何请求或函数调用
    * ，只会将传入的userId设置不对劲userIdLiveData当中，一旦userIdLiveData的数据发生变化，那么
    * 观察userIdLiveData的switchMap()方法就会执行，并且调用我们编写的转换函数。然后在转换函数中调用
    * Repository.getUser()方法获取真正的用户数据。同时，switchMap()方法将Repository.getUser()方法返回
    * 的LiveData对象转成一个可观察的LiveData对象，对于Activity而言，只要观察这个LiveData对象就可以了。
    * */
    val user:LiveData<User> = Transformations.switchMap(userIdLiveData){userId ->
        Repository.getUser(userId)
    }


    //这里在init结构体中给counter设置数据，这样之前保存的计数值就可以在初始化的时候得到恢复。
    init {
        _counter.value = countReserver
    }

    fun plusOne(){
        val count = counter.value ?:0
        _counter.value = count + 1
    }

    fun clear(){
        _counter.value = 0
    }

    fun getUser(userId:String){
        userIdLiveData.value = userId
    }
}